package com.luoshizhen.lease.web.admin.custom.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Knife4jConfiguration {

    /**
     * 配置自定义的OpenAPI信息
     *
     * 此方法用于定义和配置应用程序的OpenAPI文档的元数据，如标题、版本和描述
     * 通过此配置，可以在Swagger UI中显示有关API的详细信息，以便开发者和用户更好地理解和使用API
     *
     * @return OpenAPI 实例，包含API文档的配置信息
     */
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI().info(
                new Info()
                        .title("后台管理系统API")
                        .version("1.0")
                        .description("后台管理系统API"));
    }

    /**
     * 配置系统信息管理的API分组
     *
     * 通过此方法，我们定义了一个名为"系统信息管理"的API分组，以便在大型项目中对API进行逻辑分组和管理
     * 这有助于在项目中更好地组织和导航API文档，特别是当项目包含多个模块或子系统时
     *
     * @return GroupedOpenApi 返回配置好的GroupedOpenApi实例，用于Springfox或Springdoc等框架来生成API文档
     */
    @Bean
    public GroupedOpenApi systemAPI() {

        // 构建一个GroupedOpenApi实例，指定该分组的名称为"系统信息管理"，并定义了匹配路径规则
        // 路径规则"/admin/system/**"表示该分组将包含所有以"/admin/system"开头的API端点
        // 这种方式允许我们灵活地将特定的API端点集合归类到一个逻辑分组中，便于管理和维护
        return GroupedOpenApi.builder().group("系统信息管理").
                pathsToMatch(
                        "/admin/system/**"
                ).
                build();
    }

    /**
     * 配置后台登录管理的API分组
     *
     * 通过此方法，我们可以定义哪些API接口路径属于"后台登录管理"分组
     * 这有助于大型项目中的API文档管理和维护
     *
     * @return GroupedOpenApi对象，包含了后台登录管理相关的API路径配置
     */
    @Bean
    public GroupedOpenApi loginAPI() {

        // 创建并配置一个GroupedOpenApi实例，用于定义后台登录管理的API分组
        // 该分组包括了所有以"/admin/login/"开头的路径和"/admin/info"路径
        // 这种分组方式有助于在大型项目中对API进行分类管理和文档生成
        return GroupedOpenApi.builder().group("后台登录管理").
                pathsToMatch(
                        "/admin/login/**",
                        "/admin/info"
                ).
                build();
    }

    /**
     * 配置并返回一个GroupedOpenApi对象，用于定义公寓信息管理相关的API分组
     *
     * @return GroupedOpenApi对象，包含了公寓信息管理API的路径匹配规则
     */
    @Bean
    public GroupedOpenApi apartmentAPI() {

        // 创建GroupedOpenApi对象，指定该分组的名称为"公寓信息管理"
        // 并添加多个路径匹配规则，以便将相关API归类到此分组中
        return GroupedOpenApi.builder().group("公寓信息管理").
                pathsToMatch(
                        "/admin/apartment/**",
                        "/admin/room/**",
                        "/admin/label/**",
                        "/admin/facility/**",
                        "/admin/fee/**",
                        "/admin/attr/**",
                        "/admin/payment/**",
                        "/admin/region/**",
                        "/admin/term/**",
                        "/admin/file/**"
                ).build();
    }
    /**
     * 配置租赁信息管理相关的API分组
     *
     * 通过此方法，我们定义了租赁信息管理这一API分组，以及该分组下包含的API路径
     * 主要是为了便于API的管理和文档的清晰展示
     *
     * @return GroupedOpenApi 返回配置好的API分组实例
     */
    @Bean
    public GroupedOpenApi leaseAPI() {
        // 创建并配置API分组，指定该分组关注的API路径
        return GroupedOpenApi.builder().group("租赁信息管理")
                .pathsToMatch(
                        "/admin/appointment/**",
                        "/admin/agreement/**"
                ).build();
    }
    /**
     * 配置并返回一个特定用户管理API分组的Bean
     * 该方法定义了哪些API路径应被分组在一起，并应用相同的配置
     * 主要用于Spring Boot应用中，结合OpenAPI（原Swagger）使用，以便在API文档中对API进行分组和展示
     *
     * @return GroupedOpenApi对象，代表配置了特定路径匹配规则的API分组
     */
    @Bean
    public GroupedOpenApi userAPI() {
        // 创建并配置一个GroupedOpenApi实例，用于定义用户管理API分组的属性
        return GroupedOpenApi.builder().group("平台用户管理")
                // 指定该分组要匹配的API路径，这里表示匹配所有以"/admin/user/"开头的路径
                .pathsToMatch(
                        "/admin/user/**"
                ).build();
    }
}